/**
 * Create by CaoWenjian
 *
 * @copyRight: 2018
 **/
package com.bjboot.caocao.system.controller;

import com.bjboot.caocao.common.utils.MD5Utils;
import com.bjboot.caocao.common.utils.Result;
import com.bjboot.caocao.system.annotation.BJLog;
import com.bjboot.caocao.system.config.BJBootSysConfigParam;
import com.bjboot.caocao.system.domain.FileDO;
import com.bjboot.caocao.system.domain.MenuDO;
import com.bjboot.caocao.system.domain.Tree;
import com.bjboot.caocao.common.service.FileService;
import com.bjboot.caocao.system.service.MenuService;
import com.bjboot.caocao.system.shiro.ShiroUtils;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.List;

/**
 *@Description 系统登陆控制器，包括主页等相关等控制
 *@Author 操文健
 *@Date 2018-09-04 下午5:00
 *@Version 1.0
 **/
@Controller
public class LoginController extends UserBaseController{
    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    @Autowired
    MenuService menuService;

    @Autowired
    private FileService fileService;

    @Autowired
    private BJBootSysConfigParam bjBootSysConfigParam;
    /**
     * 对根目录对重定向
     * @param model
     * @return
     */
    @ApiOperation(value = "重定向到登陆界面")
    @GetMapping({ "/", "" })
    String welcome(Model model) {
        logger.debug("系统访问根目录，开始重定向到设定到主页...");
        return "redirect:/login";
    }

    /**
     * 项目访问主页，主页布局等
     * @return
     */
    @ApiOperation(value = "系统登陆后的主页")
    @BJLog("访问系统主页")
    @GetMapping("/index")
    String index(Model model) {

        // 目前先不根据用户Id获取菜单
        List<Tree<MenuDO>> menus = menuService.listMenuTree(getUserId());
        model.addAttribute("menus", menus);

        // 根据用户对应的picId进行查询文件表中的文件信息
        FileDO fileDO = fileService.get(getUser().getPicId());
        if (!org.springframework.util.StringUtils.isEmpty(fileDO) &&
                StringUtils.isNotEmpty(fileDO.getUrl()) &&
                (fileService.isExist(fileDO.getUrl()))) {
            // 直接使用数据库保存的路径，通过BJWebConfigurer配置本地路径映射访问
            model.addAttribute("picUrl", fileDO.getUrl());
        } else {
            model.addAttribute("picUrl","img/system/photo_s.jpg");
        }

        model.addAttribute("username", getUser().getUsername());
        return "/system/index";
    }

    // 项目的登陆界面
    @ApiOperation(value = "登陆界面Module")
    @GetMapping("/login")
    String loginPage() {
        return "/system/login";
    }

    /**
     * 项目的登陆验证请求处理
     * @param username
     * @param password
     * @return
     */
    @ApiOperation(value = "系统登陆，验证用户密码")
    @BJLog("登陆系统请求")
    @PostMapping("/ajaxLogin")
    @ResponseBody
    Result ajaxLogin(String username, String password) {
        logger.debug("开始验证用户名：" + username + "；密码：" + password);
        if (StringUtils.isEmpty(username) || StringUtils.isEmpty(password)) {
            logger.info("用户名或者密码为空");
            return Result.error("用户名和密码不能为空");
        }

        // 对密码进行加密
        password = MD5Utils.encrypt(username, password);
        // shiro进行验证
        UsernamePasswordToken token = new UsernamePasswordToken(username, password);
        Subject subject = SecurityUtils.getSubject();
        try {
            subject.login(token);
            return Result.ok();
        } catch (AuthenticationException e) {
            logger.info("登陆验证失败，原因为：" + e.getMessage());
            return Result.error(e.getMessage());
        }
    }

    @ApiOperation(value = "登出，重定向到登陆界面")
    @GetMapping("/logout")
    String logout() {
        ShiroUtils.logout();
        return "redirect:/login";
    }

    @ApiOperation(value = "登陆系统后的主页Main")
    // 项目登陆后的主界面，项目的概述介绍
    @GetMapping("/main")
    String main(Model model) {
        model.addAttribute("username", getUser().getName());
        return "/system/main";
    }
}
